package com.burst.reptile.common.utils.sms;

import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.burst.reptile.common.constant.HttpStatus;
import com.burst.reptile.common.exception.CustomException;
import com.burst.reptile.common.utils.ToolUtil;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 发送短信验证
 * 
 * @author wujin
 *
 * @date: 2020年6月19日 下午5:20:34
 */
@Slf4j
public class SendSms {

	public static final String SDKAPPID = "1400160261";

	public static final String APPKEY = "3e96446c778e0ff145ce0c4242a09980";

	public static String SMSURL = "https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid=SDKAPPID&random=RANDOM";

	/**
	 * 发送短信
	 * 
	 * @param msg 消息体
	 * @param code 验证码
	 * @param mobile 手机号
	 */
	public static void send(String msg, String code, String mobile) {
		// 发送短信验证码
		String url = SMSURL.replace("SDKAPPID", SDKAPPID).replace("RANDOM", code);
		// 封装请求参数
		long time = System.currentTimeMillis() / 1000;
		Map<String, Object> map = new HashMap<>();
		map.put("params", new String[] { msg, code, "5" });
		map.put("sign", "");
		map.put("time", time);
		map.put("ext", "");
		map.put("extend", "");
		Map<String, Object> telMap = new HashMap<>();
		telMap.put("mobile", mobile);
		telMap.put("nationcode", "86");
		map.put("tel", telMap);
		map.put("tpl_id", 225874);
		String str = "appkey=" + APPKEY + "&random=" + code + "&time=" + time + "&mobile=" + mobile;
		map.put("sig", SecureUtil.sha256(str));
		String jsonString = JSONObject.toJSONString(map);
		String result = HttpUtil.post(url, jsonString);
		JSONObject parseObject = JSONObject.parseObject(result);
		if (parseObject.getIntValue("result") != 0) {
			log.error("向手机号：{}，发送短信失败：{}", mobile, result);
			String string = parseObject.getString("errmsg");
			throw new CustomException(StrUtil.isNotEmpty(string) ? string : "验证码发送失败", HttpStatus.ERROR);
		}
	}
	
	/**
	 * 发送短信
	 * @param code 验证码
	 * @param templateID 模板ID
	 * @param mobile 手机号
	 */
	public static void sendSdk(String code, String templateID, String mobile) {
		try {
			boolean isOk = false;
			Credential cred = new Credential("AKIDs79yme08bswkKeKgW3gsqZ4NRL5yitWu", "xnNvqXzMSmsiOAj7F5D6j5OTSL7LceBi");
			SmsClient client = new SmsClient(cred, "ap-chongqing");
			SendSmsRequest req = new SendSmsRequest();
			String appid = "1400401082";
			req.setSmsSdkAppid(appid);
			String sign = "骐帅科技";
			req.setSign(sign);
			req.setTemplateID(templateID);
			String[] phoneNumbers = { "+86" + mobile};
			req.setPhoneNumberSet(phoneNumbers);
			String[] templateParams = {code};
			req.setTemplateParamSet(templateParams);
			SendSmsResponse res = client.SendSms(req);
			String jsonString = SendSmsResponse.toJsonString(res);
			JSONObject parseObject = JSONObject.parseObject(jsonString);
			JSONArray jsonArray = parseObject.getJSONArray("SendStatusSet");
			if(ToolUtil.isNotEmpty(jsonArray)) {
				JSONObject jsonObject = jsonArray.getJSONObject(0);
				String str = jsonObject.getString("Code");
				if(StrUtil.equals(str, "Ok")) {
					isOk = true;
				}
			}
			if(!isOk) {
				log.error(jsonString);
				throw new CustomException("验证码发送失败", HttpStatus.ERROR);
			}
		} catch (TencentCloudSDKException e) {
			log.error("向手机号：{}，发送短信失败：{}", mobile, e);
			throw new CustomException("验证码发送失败", HttpStatus.ERROR);
		}
	}

//	public static void main(String[] args) {
//		send("测试", "2322", "18375802521");
//	}

	public static void main(String[] args) {
		try {
			Credential cred = new Credential("AKIDs79yme08bswkKeKgW3gsqZ4NRL5yitWu", "xnNvqXzMSmsiOAj7F5D6j5OTSL7LceBi");
			/*
			 * 实例化 SMS 的 client 对象 第二个参数是地域信息，可以直接填写字符串 ap-guangzhou，或者引用预设的常量
			 */
			SmsClient client = new SmsClient(cred, "ap-chongqing");
			/*
			 * 实例化一个请求对象，根据调用的接口和实际情况，可以进一步设置请求参数 您可以直接查询 SDK 源码确定接口有哪些属性可以设置
			 * 属性可能是基本类型，也可能引用了另一个数据结构 推荐使用 IDE 进行开发，可以方便地跳转查阅各个接口和数据结构的文档说明
			 */
			SendSmsRequest req = new SendSmsRequest();

			/* 短信应用 ID: 在 [短信控制台] 添加应用后生成的实际 SDKAppID，例如1400006666 */
			String appid = "1400401082";
			req.setSmsSdkAppid(appid);
			/* 短信签名内容: 使用 UTF-8 编码，必须填写已审核通过的签名，可登录 [短信控制台] 查看签名信息 */
			String sign = "骐帅科技";
			req.setSign(sign);

			/* 模板 ID: 必须填写已审核通过的模板 ID，可登录 [短信控制台] 查看模板 ID */
			String templateID = "666301";
			req.setTemplateID(templateID);

			/*
			 * 下发手机号码，采用 e.164 标准，+[国家或地区码][手机号] 例如+8613711112222， 其中前面有一个+号
			 * ，86为国家码，13711112222为手机号，最多不要超过200个手机号
			 */
			String[] phoneNumbers = { "+8618375802521"};
			req.setPhoneNumberSet(phoneNumbers);

			/* 模板参数: 若无模板参数，则设置为空 */
			String[] templateParams = {"1234", "11", "5"};
			req.setTemplateParamSet(templateParams);

			/*
			 * 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的 返回的 res 是一个 SendSmsResponse
			 * 类的实例，与请求对象对应
			 */
			SendSmsResponse res = client.SendSms(req);
			JSONObject parseObject = JSONObject.parseObject(SendSmsResponse.toJsonString(res));
			JSONArray jsonArray = parseObject.getJSONArray("SendStatusSet");
			if(ToolUtil.isNotEmpty(jsonArray)) {
				JSONObject jsonObject = jsonArray.getJSONObject(0);
				String str = jsonObject.getString("Code");
				if(StrUtil.equals(str, "Ok")) {
					System.out.println(11);
				}
			}
		} catch (TencentCloudSDKException e) {
			e.printStackTrace();
		}
	}

}